#coding=utf-8
import numpy as np
from  preprocessing.universal import mat_filters,transform
import xlwt
# 3D绘图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
class excel_2_3dplot:
    '''
        基于Epoch对数据进行分析
        ssvep离线分析代码,包括电极分析，数据导出等
    '''
    def __init__(self):
        self.matrix=[]
        self.plt_matrix=[]

    def Load_Data(self,dat):
        ''' 载入数据    '''
        self.matrix=dat

    def Export_PSD_(self,l_freq=6.0,h_freq=30.0,fileName='export_data.xls',channels=[]):
        '''
        导出当前的切片数据文件的功率谱密度到
        :param freqsRange:  FFT频率范围
        :param fileName:    导出文件名
        :return:    无
        '''
        #打开Excel文件
        wb=xlwt.Workbook(fileName)
        fft_Mat=[]
        freq_Mat=[]
        ''' 变换为FFT矩阵'''
        for mat in self.matrix:
            ''' 逐个Epoch计算   '''
            #计算出FFT矩阵
            fm,sm=transform.FFT_Transform(mat, h_freq=h_freq, l_freq=l_freq)
            fft_Mat.append(sm);freq_Mat=fm
        '''
            fft_Mat格式：
            [Epoch_n][ch_n][fft_n]
        '''
        fft_Mat=np.array(fft_Mat)
        epoch,ch,t_series=fft_Mat.shape
        fft_Average=np.average(fft_Mat,0)
        fft_Max=np.max(fft_Mat,0)
        fft_min=np.min(fft_Mat,0)
        posBar=fft_Max-fft_Average
        negBar=fft_Average-fft_min
        sheet=wb.add_sheet('PSD统计数据')
        #sheet
        chLen=len(channels)
        ''' 写入横轴标题'''
        for i in range(chLen):
            sheet.write(0 , i*3+1, channels[i]+'平均')
            sheet.write(0, i * 3 + 2, channels[i] + '正误差')
            sheet.write(0, i * 3 + 3, channels[i] + '负误差')
        ''' 写入数据'''
        for t in range(t_series):
            '''纵轴标题（时间域）'''
            sheet.write(t + 1, 0, freq_Mat[t])
            for channel in range(ch):
                '''
                    逐点导出数据
                '''
                sheet.write(t+1,channel*3+1,fft_Average[channel][t])
                sheet.write(t + 1, channel * 3 + 2, posBar[channel][t])
                sheet.write(t + 1, channel * 3 + 3, negBar[channel][t])
        wb.save(fileName)




